home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #324 (1994-04)(Rhein-Sieg-Soft).zip / Franz PD Disk #324 (1994-04)(Rhein-Sieg-Soft).adf / VideoText3.5 / source / startup.p < prev    next >
Text File  |  1994-04-01  |  6KB  |  194 lines

  1. UNIT startup; {$project vt }
  2. { Wertet die Programmstartargumente für VideoText aus }
  3.  
  4. INTERFACE; FROM vt USES global,jobs,datei,i2c_serial;
  5.  
  6. PROCEDURE get_args;
  7.  
  8. { ---------------------------------------------------------------------- }
  9.  
  10. IMPLEMENTATION;
  11. {$opt b-}
  12. {$incl "workbench/startup.h", "icon.lib", "dos.lib" }
  13.  
  14. FUNCTION value(s: Str80): Long;
  15. { kann Hex- und Dezimalzahlen dekodieren (Hex muß mit "$" anfangen) }
  16. { Sehr primitive Version: Vorzeichen wird nicht berücksichtigt }
  17. VAR i: Integer;
  18.     x: Long;
  19. BEGIN
  20.   i := 1; x := 0;
  21.   WHILE s[i]=' ' DO Inc(i);
  22.   IF s[i]='$' THEN BEGIN
  23.     Inc(i);
  24.     WHILE s[i] IN ['0'..'9','A'..'F','a'..'f'] DO BEGIN
  25.       x := x SHL 4 + ord(s[i]);
  26.       CASE s[i] OF
  27.         '0'..'9': x := x - ord('0');
  28.         'A'..'F': x := x - ord('A') + 10;
  29.         'a'..'f': x := x - ord('a') + 10;
  30.       END;
  31.       Inc(i);
  32.     END;
  33.   END ELSE
  34.     WHILE s[i] IN ['0'..'9'] DO BEGIN
  35.       x := x*10 + ord(s[i]) - ord('0');
  36.       Inc(i);
  37.     END;
  38.   value := x;
  39. END;
  40.  
  41. FUNCTION getpages(filename: Str80): Integer;
  42. { Alle VT-Seiten aus einer VTPG-Datei einlesen und in die Seitenliste }
  43. { einreihen. Rückgabewert: Anzahl der gelesenen Seiten }
  44. VAR i, gelesen: Integer;
  45.     bytes: ^ARRAY[1..41] OF Char;
  46.     datei: Text;
  47.     zeile: Str80;
  48.     seite: p_onepage;
  49. BEGIN
  50.   gelesen := 0;
  51.   Reset(datei,filename);
  52.   IF (IOresult<>0) THEN     { Datei existiert nicht }
  53.     Exit;
  54.   WHILE NOT EoF(datei) DO BEGIN
  55.     REPEAT
  56.       ReadLn(datei,zeile);
  57.     UNTIL (zeile='VTPG') OR EoF(datei);
  58.     if zeile='VTPG' THEN BEGIN
  59.       New(seite);
  60.       FOR i := 0 to 23 DO BEGIN
  61.         bytes := Ptr(^seite^.chars[40*i]);
  62.         BlockRead(datei,bytes^,40);
  63.         ReadLn(datei);
  64.       END;
  65.       Read(datei,seite^.pg,seite^.sp); ReadLn(datei,zeile);
  66.       seite^.cbits := value(zeile);
  67.       ins_to_list(seite); Inc(gelesen);
  68.     END;
  69.   END;
  70.   Close(datei);
  71.   getpages := gelesen;
  72. END;
  73.  
  74. PROCEDURE get_args;
  75. { wertet CLI- oder WorkBench-Argumente aus }
  76. { ToolTypes:                  CLI-Parameter:  }
  77. { FILE=<output name>          -f=<output name> }
  78. { MAXWAIT=<seconds>           -w<seconds> }
  79. { BUSDELAY=<counter>          -d<counter> }
  80. { BURST=<tics>                -b<tics> }
  81. { SHUFFLE=<tics>              -s<tics> }
  82. {                             <page> <page> ... }
  83. {                             <file> <file> ... }
  84. var s: bigstring;
  85.     len,i,j,k,ok,gelesen: integer;
  86.     name: str80;
  87.     is_job: Boolean;
  88.     hail: p_WBStartup;
  89.     arg: p_WBArg;
  90.     olddir: BPTR;
  91.     icon: p_DiskObject;
  92.     entry: Str;
  93. FUNCTION is_space(ch: Char): Boolean;
  94.   BEGIN  is_space := (ch=' ') OR (ch=#9) OR (ch=#10) OR (ch=#13);  END;
  95. BEGIN
  96.   outputname := 'RAM:VTdatei'; { default-Ausgabedatei }
  97.   queued := 0;
  98.   maxwait := 60;
  99.   busdelay := 0;
  100.   burst := 0;
  101.   shuffle := 20;
  102.   gelesen := 0;
  103.   IF fromWB THEN BEGIN
  104.     OpenLib(IconBase,'icon.library',0);
  105.     hail := StartupMessage;
  106.     arg := hail^.sm_ArgList;
  107.     FOR i := 1 to hail^.sm_NumArgs DO BEGIN
  108.       olddir := CurrentDir(arg^.wa_Lock);
  109.       name := arg^.wa_Name;
  110.       IF i=1 THEN BEGIN  { 1. Datei: das Programm selbst, ToolTypes checken }
  111.         icon := GetDiskObject(name);
  112.         IF icon<>Nil THEN BEGIN
  113.           entry := FindToolType(icon^.do_ToolTypes, 'FILE');
  114.           if ptr(entry)<>Nil then
  115.             outputname := entry;
  116.           entry := FindToolType(icon^.do_ToolTypes, 'MAXWAIT');
  117.           if ptr(entry)<>Nil then
  118.             Val(entry,maxwait,ok);
  119.           entry := FindToolType(icon^.do_ToolTypes, 'BUSDELAY');
  120.           if ptr(entry)<>Nil then
  121.             Val(entry,busdelay,ok);
  122.           entry := FindToolType(icon^.do_ToolTypes, 'BURST');
  123.           if ptr(entry)<>Nil then
  124.             Val(entry,burst,ok);
  125.           entry := FindToolType(icon^.do_ToolTypes, 'SHUFFLE');
  126.           if ptr(entry)<>Nil then
  127.             Val(entry,shuffle,ok);
  128.           FreeDiskObject(icon);
  129.         END;
  130.       END ELSE  { zusätzliche Dateien: enthalten Seiten, einlesen }
  131.         IF filetype(name)=1 THEN
  132.           gelesen := gelesen + getpages(name);
  133.       olddir := CurrentDir(olddir);
  134.       { auf nächsten WBArg-Zeiger zugreifen: }
  135.       arg := Ptr(Long(arg)+SizeOf(WBArg));
  136.     END;
  137.     CloseLib(IconBase);
  138.   end else if ParameterLen>0 then begin
  139.     s := copy(ParameterStr,1,ParameterLen);
  140.     len := length(s);
  141.     { Parameterzeile in Worte zerlegen, wie der argv[] in C es schon ist :-( }
  142.     i := 1; while i<=len do begin
  143.       while is_space(s[i]) do Inc(i);
  144.       j := i + 1;
  145.       if s[i]='"' then begin
  146.         Inc(i); while (s[j]<>'"') AND (j<=len) do Inc(j);
  147.       end else begin
  148.         while NOT is_space(s[j]) AND (j<=len) do Inc(j);
  149.       end;
  150.       { Zeiger i: 1. Zeichen des Wortes, j: 1. Trennzeichen dahinter }
  151.       if s[i]='-' then begin
  152.         i := i+2;
  153.         case s[i-1] of
  154.           'f': begin
  155.               if s[i] = '=' then Inc(i);
  156.               if j>i then
  157.                 outputname := copy(s,i,j-i);
  158.             end;
  159.           'd': Val(copy(s,i,j-i),busdelay,ok);
  160.           'w': Val(copy(s,i,j-i),maxwait,ok);
  161.           'b': Val(copy(s,i,j-i),burst,ok);
  162.           's': Val(copy(s,i,j-i),shuffle,ok);
  163.           otherwise begin
  164.             writeln('usage:');
  165.             writeln('VideoText <pages> <files> -f=<name> -d<loops> -w<secs> -b<tics> -s<tics>');
  166.             writeln('-f: OUTPUT file, -d: slow down I²C-bus, -w: max. wait for pages to arrive');
  167.             writeln('transmission time per page ... -b: in burst mode, -s: in shuffle mode');
  168.             writeln('e. g.: VideoText 112 113 114 115 -f=RAM:VTdatei -d0 -w60 -b0 -s20');
  169.           end;
  170.         end;
  171.       END ELSE BEGIN
  172.         { Was nur aus '0123456789/' besteht, ist eine Seitennummer, alles andere eine }
  173.         { Eingabedatei. }
  174.         is_job := True;
  175.         FOR k := i TO j-1 DO
  176.           IF NOT (s[k] IN ['0'..'9','/']) THEN is_job := False;
  177.         IF is_job THEN
  178.           add_job(copy(s,i,j-i))
  179.         ELSE IF filetype(Copy(s,i,j-i))=1 THEN
  180.           gelesen := gelesen + getpages(Copy(s,i,j-i));
  181.       END;
  182.       i := j + 1;
  183.     END;
  184.   END;
  185.   IF (queued=0) AND (gelesen=0) THEN BEGIN
  186.     queued := 1;
  187.     queue[1].pg := 100; queue[1].sp := 0;
  188.   END;
  189. END;
  190.  
  191. BEGIN  { Initialisierung }
  192. END.
  193.  
  194.